package com.eight.controller.api;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.eight.annotation.OperateLog;
import com.eight.enums.BussinessType;
import com.eight.feign.UserFeign;
import com.eight.pojo.TbCoupon;
import com.eight.pojo.TbUserCoupon;
import com.eight.sertvice.CouponService;
import com.eight.vo.ComResult;
import com.eight.vo.CouponUserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Description: TODO
 * @Author: Van.Planifolia
 * @CreateTime: 2023-02-28  16:06
 * @Version: 1.0
 */
@RestController
public class CouponApi {
    // 注入service
    @Resource(name = "couponService")
    private CouponService couponService;
    @Autowired
    private UserFeign userFeign;


    /**
     * 分页查询全部的优惠券信息
     *
     * @param pageIndex 页面索引
     * @param pageSize  页面大小
     * @return 查询出来的结果
     */
    @GetMapping("/coupon/list/{pageIndex}/{pageSize}")
    public ComResult list(@PathVariable Integer pageIndex, @PathVariable Integer pageSize) {
        return couponService.getPage(pageIndex, pageSize);
    }

    /**
     * 根据主键进行修改操作
     *
     * @param tbCoupon 优惠券的数据
     * @return 结果
     */
    @PostMapping("/coupon/modify")
    @OperateLog(title = "修改优惠券", businessType = BussinessType.MODIFY)
    public ComResult modify(@RequestBody TbCoupon tbCoupon) {
        return couponService.updateById(tbCoupon) ? new ComResult(2000, "修改成功") : new ComResult(5000, "修改失败");
    }

    /**
     * 根据主键进行删除操作
     *
     * @param id 主键id
     * @return 删除后的结果
     */
    @GetMapping("/coupon/remove/{id}")
    public ComResult remove(@PathVariable Integer id) {
        return couponService.removeById(id) ? new ComResult(2000, "删除成功！") : new ComResult(5000, "删除失败");
    }

    /**
     * 进行模糊查询
     *
     * @param tbCoupon  查询条件
     * @param pageIndex 分页索引
     * @param pageSize  分页大小
     * @return 查询的结果
     */
    @PostMapping("/coupon/fuzzy/{pageIndex}/{pageSize}")
    public ComResult fuzzySearch(@PathVariable Integer pageIndex, @PathVariable Integer pageSize, @RequestBody TbCoupon tbCoupon) {
        return couponService.fuzzySearchPage(tbCoupon, pageIndex, pageSize);
    }

    /**
     * 批量查询ids数组中的优惠券
     *
     * @param ids 优惠券id
     * @return 查询的List
     */
    @PostMapping("/coupon/batchSearch/")
    public List<TbCoupon> batchSearch(@RequestBody List<Integer> ids) {
        return ids.size() == 0 ? null : couponService.batchSearchById(ids);
    }

    /**
     * 插入单条优惠券信息
     *
     * @param tbCoupon 优惠券对象
     * @return 插入的结果
     */
    @PostMapping("/coupon/add")
    public ComResult addCoupon(@RequestBody TbCoupon tbCoupon) {
        // 修改一下tbCoupon里面的默认值
        tbCoupon.setCount(tbCoupon.getPublishCount());
        return couponService.save(tbCoupon) ? new ComResult(2000, "插入成功") : new ComResult(5000, "插入失败");
    }

    /**
     * 获取当前用户可领取的优惠券信息
     *
     * @return 前端需要的结果
     */
    @GetMapping("/coupon/global/{username}")
    public ComResult getGlobal(@PathVariable String username) {
        // 查出来全部的全局券
        List<TbCoupon> globalCoupon = couponService.list(new QueryWrapper<TbCoupon>().eq("use_type", 1));
        // 查出来用户拥有的券
        List<TbUserCoupon> tbUserCoupons = userFeign.selectAllUser(username);
        // 并行流挑选出来用户可以领取的券
        // 下面显示循环当前用户所有拥有的券，然后与当前可用的券进行比较若没有重复领取就让他显示
        List<TbCoupon> collect = globalCoupon.stream().parallel().filter(e ->
                tbUserCoupons.stream().parallel().noneMatch(u -> Objects.equals(e.getId(), u.getCouponId()))
        ).collect(Collectors.toList());
        return new ComResult(2000, "查询成功", collect);
    }

    /**
     * 插入一条优惠券信息
     *
     * @param couponUserVo 需要的信息
     * @return 领取结果
     */
    @PostMapping("/coupon/addUserCoupon")
    public ComResult addUserCoupon(@RequestBody CouponUserVo couponUserVo) {
        System.out.println(couponUserVo);
        return couponService.addUserCoupon(couponUserVo.getTbCoupon(), couponUserVo.getTbUser());
    }
}
